Spring JDBC-তে ResultSetExtractor
একটি ইন্টারফেস, যা জটিল ডাটাবেস অপারেশনের জন্য ব্যবহার করা হয়। এটি ডাটাবেস থেকে রিট্রাইভ করা ResultSet
এর উপর কাস্টম প্রক্রিয়াকরণ করার জন্য একটি সুবিধাজনক পদ্ধতি সরবরাহ করে।
ResultSetExtractor একটি ফাংশনাল ইন্টারফেস যা শুধুমাত্র একটি মেথড সরবরাহ করে:
T extractData(ResultSet rs) throws SQLException, DataAccessException;
JdbcTemplate
API এর সাথে সহজেই ইন্টিগ্রেটেড।RowMapper
যথেষ্ট নয়, তখন ResultSetExtractor ব্যবহৃত হয়।ধরা যাক আমাদের একটি employees
টেবিল রয়েছে:
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50),
salary DECIMAL(10, 2)
);
আমরা ResultSetExtractor
ব্যবহার করে একটি তালিকা তৈরি করব যেখানে প্রত্যেক ডিপার্টমেন্টের অধীনে কাজ করা সকল কর্মচারী থাকবে।
কোড:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.stereotype.Service;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Service
public class EmployeeService {
@Autowired
private JdbcTemplate jdbcTemplate;
public Map<String, List<String>> getEmployeesByDepartment() {
String sql = "SELECT name, department FROM employees";
return jdbcTemplate.query(sql, new ResultSetExtractor<Map<String, List<String>>>() {
@Override
public Map<String, List<String>> extractData(ResultSet rs) throws SQLException {
Map<String, List<String>> departmentMap = new HashMap<>();
while (rs.next()) {
String department = rs.getString("department");
String name = rs.getString("name");
departmentMap.putIfAbsent(department, new ArrayList<>());
departmentMap.get(department).add(name);
}
return departmentMap;
}
});
}
}
ফলাফল:
যদি টেবিলের ডাটা এই রকম হয়:
INSERT INTO employees (id, name, department, salary) VALUES (1, 'John Doe', 'HR', 50000);
INSERT INTO employees (id, name, department, salary) VALUES (2, 'Jane Smith', 'IT', 60000);
INSERT INTO employees (id, name, department, salary) VALUES (3, 'Bob Johnson', 'HR', 45000);
তাহলে মেথডটি রিটার্ন করবে:
{
"HR": ["John Doe", "Bob Johnson"],
"IT": ["Jane Smith"]
}
ধরা যাক, আপনি প্রতিটি ডিপার্টমেন্টের জন্য টোটাল সেলারি এবং কর্মচারীদের সংখ্যা খুঁজছেন।
কোড:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.stereotype.Service;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
@Service
public class DepartmentStatsService {
@Autowired
private JdbcTemplate jdbcTemplate;
public Map<String, Map<String, Object>> getDepartmentStats() {
String sql = "SELECT department, COUNT(*) AS employee_count, SUM(salary) AS total_salary FROM employees GROUP BY department";
return jdbcTemplate.query(sql, new ResultSetExtractor<Map<String, Map<String, Object>>>() {
@Override
public Map<String, Map<String, Object>> extractData(ResultSet rs) throws SQLException {
Map<String, Map<String, Object>> statsMap = new HashMap<>();
while (rs.next()) {
String department = rs.getString("department");
int employeeCount = rs.getInt("employee_count");
double totalSalary = rs.getDouble("total_salary");
Map<String, Object> stats = new HashMap<>();
stats.put("employee_count", employeeCount);
stats.put("total_salary", totalSalary);
statsMap.put(department, stats);
}
return statsMap;
}
});
}
}
ফলাফল:
যদি টেবিলের ডাটা এই রকম হয়:
INSERT INTO employees (id, name, department, salary) VALUES (1, 'John Doe', 'HR', 50000);
INSERT INTO employees (id, name, department, salary) VALUES (2, 'Jane Smith', 'IT', 60000);
INSERT INTO employees (id, name, department, salary) VALUES (3, 'Bob Johnson', 'HR', 45000);
তাহলে মেথডটি রিটার্ন করবে:
{
"HR": {
"employee_count": 2,
"total_salary": 95000.0
},
"IT": {
"employee_count": 1,
"total_salary": 60000.0
}
}
প্যারামিটার | ResultSetExtractor | RowMapper |
---|---|---|
ব্যবহার ক্ষেত্র | একাধিক রেকর্ড থেকে জটিল প্রসেসিং প্রয়োজন। | প্রতিটি রেকর্ডকে একটি অবজেক্টে ম্যাপ করা। |
রিটার্ন টাইপ | কাস্টম ডাটা টাইপ রিটার্ন করে। | একটি লিস্ট বা একক অবজেক্ট রিটার্ন করে। |
লজিকের জটিলতা | জটিল ডাটা প্রসেসিং সহজ। | সাধারণ ডাটা ম্যাপিং-এর জন্য আদর্শ। |
Spring JDBC-তে ResultSetExtractor এমন পরিস্থিতিতে ব্যবহার করা হয় যেখানে একাধিক রেকর্ড বা জটিল ডাটা প্রসেসিং প্রয়োজন। এটি ডাটাবেস থেকে রিট্রাইভ করা ডাটার উপর সম্পূর্ণ কাস্টম প্রক্রিয়াকরণ করার স্বাধীনতা প্রদান করে। সহজ ডাটা ম্যাপিং-এর জন্য RowMapper
যথেষ্ট হলেও, জটিল ডাটা লজিক ইমপ্লিমেন্ট করার জন্য ResultSetExtractor
একটি শক্তিশালী টুল।
Read more